/**
 * 柯里化
 * 自动柯里化函数的实现
 */

function add(num1, num2, num3) {
  return num1 + num2 + num3
}


function ddCurrying(fn) {
  function curried(...args) {
    //如果传递的参数已经大于等于需要的参数个数时，说明参数已经接收完毕，可以直接执行原函数
    if (args.length >= fn.length) {
      //通过apply进行this绑定，如此案例考虑curryAdd调用的时候可能进行了this的绑定
      //curryAdd.call(obj,...args),此时，this将绑定到obj
      return fn.apply(this, args)
    } else {
      //没有达到参数个数时需要返回一个新的函数，继续来接收剩余的参数
      return function (...args2) {
        //接收到剩余参数时，需要递归调用curried来检查函数的个数是否已经达到
        return curried.apply(this, [...args, ...args2])
      }
    }
  }
  
  return curried
}

//目标
var curryAdd = ddCurrying(add)
console.log(curryAdd(1, 2, 3))
console.log(curryAdd(1, 2)(3))
console.log(curryAdd(1)(2)(3))
